import functools

from components.config import WFQ_SOURCE_MYSQL_CONFIG
from utils.db.mysqldb import MysqlDB
from utils.tools import ReMixIn


class CheckUtils(object):
    _to_db = None

    def __init__(self):
        pass

    @property
    def to_db(self):
        if self._to_db is None:
            self._to_db = MysqlDB(
                ip=WFQ_SOURCE_MYSQL_CONFIG["MYSQL_IP"],
                port=WFQ_SOURCE_MYSQL_CONFIG["MYSQL_PORT"],
                db=WFQ_SOURCE_MYSQL_CONFIG["MYSQL_DB"],
                user_name=WFQ_SOURCE_MYSQL_CONFIG["MYSQL_USER_NAME"],
                user_pass=WFQ_SOURCE_MYSQL_CONFIG["MYSQL_USER_PASS"],
            )
        return self._to_db

    @functools.lru_cache(maxsize=1)
    def get_check_rules(self):
        return [
            {"type": "1", "positive_keyword": "正向", "negative_keyword": "负向"},
            {"type": "2", "positive_keyword": "正向", "negative_keyword": "负向"},
            {"type": "3", "positive_keyword": "正向", "negative_keyword": "负向"},
            {"type": "4", "positive_keyword": "正向", "negative_keyword": "负向"},
        ]

    @staticmethod
    def str_contains(txt, reg):
        return bool(ReMixIn.reg_one(reg.split("|"), txt))

    def deal_rule_type_1(self, rules, origin):
        """处理type=1的规则 仅匹配负向关键词 包含"""
        ret = False
        for rule in rules:
            negative_keyword = rule["negative_keyword"] or ""
            if "&" in negative_keyword:
                negative_keyword = [i for i in negative_keyword.split("&") if i.strip()]
            else:
                negative_keyword = [negative_keyword] or []
            if str(rule["type"]) == "1":  # 仅匹配负向关键词 包含
                result = all([self.str_contains(origin, i) for i in negative_keyword]) is True
            else:
                raise ValueError(f"出现新型规则类型 `{rule['type']}`，请及时更新代码")
            ret = ret and result
            if ret is True:
                return ret
        return ret

    def deal_rule_type_2(self, rules, origin):
        """处理type=2的规则 匹配排除正向、命中负向关键词"""
        ret = True
        for rule in rules:
            positive_keyword = rule["positive_keyword"] or ""
            if "&" in positive_keyword:
                positive_keyword = [i for i in positive_keyword.split("&") if i.strip()]
            else:
                positive_keyword = [positive_keyword] or []
            negative_keyword = rule["negative_keyword"] or ""
            if str(rule["type"]) == "2":  # 匹配排除正向、命中负向关键词
                result = ~(all([self.str_contains(origin, i) for i in positive_keyword]) is True)  # 负向全在其中
                result = result and ~(
                    all([self.str_contains(origin, i) for i in negative_keyword]) is False
                )  # 正向不在其中
            else:
                raise ValueError(f"出现新型规则类型 `{rule['type']}`，请及时更新代码")
            ret = ret and result
            if ret is False:
                return ret
        return ret

    def deal_rule_type_3(self, rules, origin):
        """处理type=3的规则 仅匹配正向关键词 包含"""
        ret = True
        for rule in rules:
            positive_keyword = rule["positive_keyword"] or ""
            if "&" in positive_keyword:
                positive_keyword = [i for i in positive_keyword.split("&") if i.strip()]
            else:
                positive_keyword = [positive_keyword] or []
            if str(rule["type"]) == "3":  # 匹配排除正向、命中负向关键词
                result = ~(all([self.str_contains(origin, i) for i in positive_keyword]) is True)
            else:
                raise ValueError(f"出现新型规则类型 `{rule['type']}`，请及时更新代码")
            ret = ret and result
            if result is False:
                return result
        return ret

    def deal_rule_type_4(self, rules, origin):
        """处理type=4的规则 匹配正向、排除负向关键词"""
        ret = True
        for rule in rules:
            positive_keyword = rule["positive_keyword"] or ""
            if "&" in positive_keyword:
                positive_keyword = [i for i in positive_keyword.split("&") if i.strip()]
            else:
                positive_keyword = [positive_keyword] or []
            negative_keyword = rule["negative_keyword"] or ""
            if str(rule["type"]) == "4":  # 匹配排除正向、命中负向关键词
                result = all([self.str_contains(origin, i) for i in positive_keyword]) & (
                    not all([self.str_contains(origin, i) for i in negative_keyword])
                )

                result = all([self.str_contains(origin, i) for i in positive_keyword]) is True  # 正向全在其中
                result = result and (
                    all([self.str_contains(origin, i) for i in negative_keyword]) is False
                )  # 负向不在其中
            else:
                raise ValueError(f"出现新型规则类型 `{rule['type']}`，请及时更新代码")
            if result is True:
                return result
            ret = ret and result
        return ret

    def check_title_is_valid(self, origin):

        # rules = self.get_check_rules()
        # for rule in rules:
        #     res = self.check_one_rules(rule, origin)
        if any(c in origin for c in ["名单", "公示", "通告", '开门红', '人工智能小镇', '财政专项', '专利专项', '“一标一品”', '中小企业“揭榜”', '孵化器项目补助资金', '科技项目经费', '“腾笼换鸟”专项资金', '浙江工匠', '科技成果转化', '首版次软件产品认定', '科技企业孵化载体', '研发创新中心', '企业升规上限', '工业转型升级政策补助', '名特优新', '智能制造项目', '雏鹰企业', '新上规模小微企业', '绿色工厂', '余姚工匠', 'AAA级守重企业', '标杆企业', '鲲鹏企业', '阳光餐饮', '云上企业', '领跑者企业', '单项冠军', '省级企业技术中心', '省级工业设计中心', '隐形冠军', '“小升规”企业', '国家实验室', '钱江杯', '兰花杯', '稽山杯', '“绍兴菜”“名店”', '首批区级农播基地', '建筑产业现代化示范企业', '浙江制造', '品字标浙江服务', '无废工厂', '监理甲级资质', '绿色低碳工厂', '绿色供应链管理企业', '国家绿色工厂', '省级智能工厂', '数宇化车间建设', '省级绿色低碳供应链管理企业', '省级互联网与制造业融合发展试点示范企业', '直播园区(基地)', '院士专家工作站', '博士创新站建站', '省级数字化车间', '节水型企业', '限上住宿企业', '市级产业投资项目', '数字化示范项目', '中国设计智造大奖', '三同企业', '专精特新中小企业', '专精特新小巨人', '中小企协AAA信用', '企业技术中心', '众创空间', '创新型中小企业', '创新型企业', '制造业单项冠军', '工程技术研究中心', '技术先进型服务企业', '技术创新示范企业', '民营科技企业', '火炬计划', '牛羚企业', '独角兽企业', '瞪羚企业', '科技企业孵化器', '科技型中小企业', '科技型初创企业', '科技小巨人', '隐形冠军企业', '高新技术企业', '龙头企业', '绿色制造', '小微企业', '国有全资', '重点实验室', '制造业单项冠军产品企业', '私募基金', '国有控股', '建筑业首特企业', '中国民营企业500强', '科技创新创业平台', '国家级科技企业孵化器', '“乡村振兴”特色加工业', '链主型龙头企业', '区级中小企业特色产业集群', '先进制造业企业', '总部企业贡献奖', '中华老字号', '国家知识产权示范企业和优势企业', '生物医药特色产业园区', '高端装备“揭榜挂帅”项目', '制造业“云上企业”名单', '“尖兵领雁+X”科技计划项目', '综合种养市级基地', '“富春杯”奖', '战略性新兴产业名单', '授奖组织名单公示', '科学技术奖名单', '政府质量奖', '授奖名单', '揭榜挂帅科技项目', '工业设计大赛', '智能制造标杆企业', 'AAA信用等级', '知识产权资助金', '国家级绿色工厂', '市长质量奖', '重点产业专利导航项目', '国家级能源资源计量服务示范项目', '工业物流补助', '工业龙头企业', '企业增产增效', '企业创新创业奖', '一次性留工培训补助企业', '小巨人企业', '粮食应急保障企业', '优质数字工程服务商企业', '杭州老字号企业', '文化和旅游部技术创新中心', '高技能人才公共实训基地', '浙江省曲艺杂技魔术大赛', '农业“双强”项目', '绿色低碳标杆厂', '“机器人+”应用标杆企业', '绿色低碳工业园区工厂', '农产品加工基地（园区）', '未来工厂培育企业', '环保装备制造业规范条件企业', '“鲲鹏”、“准鲲鹏”企业', '“鲲鹏计划”制造业企业', '新苗企业', 'AAA级“守合同重信用”企业', '***名单', '***公示', '***名单公示', '科技孵化器', '省级备案众创空间', '优秀行业产业大脑', '“浙江制造精品”', '优秀工业新产品', '5G+医疗健康应用试点', '“浙产中药”产业品牌', '人工智能', '工业互联网平台', '管理对标提升标杆企业', '未来工厂', '首席数据官试点企业', '大数据应用示范企业', '5G全连接工厂', '专精特新产业园', '清洁生产企业', '工业设计中心', '绿色低碳工业园区、工厂', '知识产权优势企业和示范企业', '科技领军企业、科技小巨人企业', '未来工厂试点企业', '重点农业企业', '工业软件优秀产品', '节水标杆园区', '服务型制造示范企业', '数字化车间智能工厂', '绿色修船企业', '节水标杆单位', '上云标杆企业', '数字经济“飞地”示范基地', '星创天地', '“雏鹰计划”企业', '新型研发机构', '工业产品绿色设计示范企业', '网络安全技术应用', '行业云应用示范平台', '火炬特色产业基地', '生物医药产业', '“两化”融合示范试点企业', '机器人典型应用场景和“机器人+”应用标杆企业', '十佳服务机构名单', '小型微型企业创业创新示范基地', '融合示范企业名单', '管理创新试点企业', '融合发展试点示范项目', '小升规企业', '企业研究院', '绿色制造创建计划名单', '三星级绿色工厂']):
            if not any(c in origin for c in ["申报", "开展", "组织", "任免", "征求"]):
                return True

        return False

    def check_one_rules(self, rule, origin):
        positive_keyword = rule["positive_keyword"]
        negative_keyword = rule["negative_keyword"]
        positive = all([self.str_contains(origin, i) for i in negative_keyword]) is True
        negative = all([self.str_contains(origin, i) for i in positive_keyword]) is True
        if negative is True:
            return False
        if positive is True and negative is False:
            return True
        if positive is True:
            return True

    def check_company_name_is_valid(self, origin):
        if len(origin) < 5:
            return False
        return True


if __name__ == "__main__":
    print(CheckUtils().check_title_is_valid("负向"))
    print(CheckUtils().check_title_is_valid("正向"))
